-- $LastChangedDate: 2007-06-01 02:52:33 +0200 (Fri, 01 Jun 2007) $
-- $LastChangedRevision: 149 $
-- $LastChangedBy: vicente $

SEPARATE (Tareas.Gmonitores)

   -- Buscar el monitor con identificador Id en la lista MList y marcarlo
   -- como libre
PROCEDURE Mark_Monitor_As_Idle (
      Mlist             : IN     Listas.Gmonitores_Lists.List_Type;
      Monid             : IN     Task_Id;
      Monitores_Libre   : IN OUT Natural;
      Monitores_Ocupado : IN OUT Natural) IS
   Encontrado : Boolean                               := False;
   It         : Listas.Gmonitores_Lists.List_Iterator;
   Nodo       : Nodomonitor;
BEGIN

   It := Listas.Gmonitores_Lists.First(Mlist);
   WHILE It /= Listas.Gmonitores_Lists.Last(Mlist) AND NOT
         Encontrado LOOP
      Nodo := Listas.Gmonitores_Lists.Value(It);
      IF Nodo.Id = Monid THEN
         Encontrado:= True;
      ELSE
         It := Listas.Gmonitores_Lists.Succ(It);
      END IF;
   END LOOP;

   -- si no encuentra el monitor deberia mostrar algun tipo de error
   IF NOT Encontrado THEN
      Print("mark_monitor_as_idle: el monitor " & Image(Monid) & " no existe");
   ELSE
      CASE Nodo.Estado IS
         WHEN Ocupado =>
            Monitores_Ocupado := Monitores_Ocupado - 1;
            Monitores_Libre := Monitores_Libre + 1;
            -- log
            Log_Add(Monitor_Libre);
            Nodo.Estado := Libre;
            Listas.Gmonitores_Lists.Update(It, Nodo);
         WHEN Ocupadoemergencia =>
            Monitores_Libre := Monitores_Libre + 1;
            -- log
            Log_Add(Monitor_Libre);
            Nodo.Estado := Libre;
            Listas.Gmonitores_Lists.Update(It, Nodo);
         WHEN OTHERS =>
            NULL;
      END CASE;

      Print("mark_monitor_as_idle: monitor "&
         Image(Nodo.Id)&" marcado como libre");
   END IF;
END Mark_Monitor_As_Idle;
